# 博客代码：https://www.bilibili.com/video/BV1Z4411o7TA?p=10&spm_id_from=pageDriver

'''
问题1 :
html中,包含有iframe的内嵌html，使用时会查找不到元素；
因为selenium不会加载iframe内部的数据。
如果使用，需要先重置wd的作用域：【wd.switch_to.frame(frame_reference)】

frame_reference可以写iframe的id或者name，
如果没有id或name，则可以写iframe的元素
元素获取方式比如：
frame_reference = wd.find_element_by_css_selector('[src="sample1.html"]')


如果用完需要重置wd的作用域，则使用：
【wd.switch_to.default_content()】

'''


'''
问题二：在一级页面中，打开二级页面，此时，获取不到二级页面的WebDriver对象，自动化操作也还是在老窗口进行，？
我们可以运行如下代码验证一下

from selenium import webdriver


wd = webdriver.Chrome(r'd:\webdrivers\chromedriver.exe')
wd.implicitly_wait(10)

wd.get('http://cdn1.python3.vip/files/selenium/sample3.html')

# 点击打开新窗口的链接
link = wd.find_element_by_tag_name("a")
link.click()

# wd.title属性是当前窗口的标题栏 文本
print(wd.title)


解决办法：

如果我们要到新的窗口里面操作，该怎么做呢？

可以使用Webdriver对象的switch_to属性的 window方法，如下所示：

wd.switch_to.window(handle)

其中，参数handle需要传入什么呢？
WebDriver对象有window_handles 属性，这是一个列表对象， 里面包括了当前浏览器里面所有的窗口句柄。
所谓句柄，大家可以想象成对应网页窗口的一个ID，
那么我们就可以通过 类似下面的代码，
------------------------------------
for handle in wd.window_handles:
    # 先切换到该窗口
    wd.switch_to.window(handle)
    # 得到该窗口的标题栏字符串，判断是不是我们要操作的那个窗口
    if 'Bing' in wd.title:
        # 如果是，那么这时候WebDriver对象就是对应的该该窗口，正好，跳出循环，
        break
------------------------------------

此时，用完二级页面的新窗口，需要切换为一级页面的老窗口，改怎么做呢？
用二级页面的句柄之前，先保存老页面的句柄，用完二级页面后再赋值回去。

# mainWindow变量保存当前窗口的句柄
mainWindow = wd.current_window_handle
切换到新窗口操作完后，就可以直接像下面这样，将driver对应的对象返回到原来的窗口

#通过前面保存的老窗口的句柄，自己切换到老窗口
wd.switch_to.window(mainWindow)


'''

from selenium import webdriver

# 1. 创建 WebDriver 对象，指明使用chrome浏览器驱动
wd = webdriver.Chrome(r'D:\soft\google\chromedriver.exe')

# 2. 防止页面加载过慢，请求是时候，如果找不到元素，
# 则每个半秒钟去界面上查看一次，直到找到该元素或超过10秒
wd.implicitly_wait(10)





wd.quit();